--- %%NOBANNER%% -->
![]() | ![]() |
/*-------------------<---Start of Description-->---------------------\ | PURPOSE: creates index, simple or composite, if it does not exist | | : Checks whether the variables entered by the user exist | | : in the data set. It exits with a message if one of the | | : vars entered by the user does not exist in the data set | | USAGE : %crindex(lr,ds,vars) | |---------------------<---End of Description-->----------------------| |--------------------------------------------------------------------| |------------<---Start of Files or Arguments Needed-->---------------| | Auguments and Variables: | | lr : libref | | ds : data set name | | vars : vars to index; vars separated by spaces | | varscom : vars separated by commas, not spaces | | indxname: name of the index to create | | ixnames : list of existing indexes on the data set | | _i_ : counter | | v : one of the vars variables | |-------------<---End of Files or Arguments Needed-->----------------| |--------------------------------------------------------------------| |------------------<---Start of Files Created-->---------------------| | Example: %crindex(sasuser,class,race) | | %crindex(sasuser,class,race sex ed) | | %crindex(sasuser,class,race sex ede) | | Usage: %crindex(libname=,indata=,vars=, outdata=&indata); | \-------------------<---End of Files Created-->---------------------*/ %macro crindex(libname=,indata=,vars=, outdata=&indata); /*--------------------------------------------\ | Author: Duo Zhou; | | Created: 8-27-2001 9:30pm; | | Purpose: Create index of variables in a | | dataset; | \--------------------------------------------*/ %*-- %put libname=&libname indata=&indata vars=&vars; %local indxname ixnames _i_ varscom; %let libname=%upcase(&libname); %let indata=%upcase(&indata); %let vars=%upcase(&vars); %if &outdata eq %then %do; %let outdata=&indata; %end; %*-------- Check if var exists in the data set; %*-------- and generate a name for the simple/composite index; proc sql noprint; select name into :allv separated by " " from dictionary.columns where libname="&libname" and memname="&indata" ; quit; %put ........................ allv=&allv; %let indxname=; %let _i_=1; %let v=%qscan(&vars,&_i_); %do %while(%length(&v) gt 0); %if %sysfunc(indexw(&allv,&v)) eq 0 %then %do; %put .............. &v does not exist in the data set: &libname..&indata; %put .............. Exiting this program; %goto finish; %end; %let indxname=&indxname.%substr(&v,1,1); %put indxname=&indxname; %let _i_=%eval(&_i_+1); %let v=%scan(&vars,&_i_); %if &_i_>8 %then %let v=; %end; %if &_i_=2 %then %let indxname=&vars; %*-- Check if index already exists; %let ixnames=; proc sql noprint; select distinct indxname into :ixnames separated by " " from dictionary.indexes where libname="&libname" and memname="&indata" ; quit; %*--- %put Existing indexes are: &ixnames; %*--- %put Name of index to create is: &indxname; %if %index(&ixnames, %upcase(&indxname))=0 %then %do; %*--- %put index &indxname does not exist; %*-- introduce commas into vars to get varscom; %let varscom=%sysfunc(translate(&vars,","," ")); %put ................. vars=&vars; %put ................. varscom=&varscom; proc sql noprint; create index &indxname on &libname..&outdata(&varscom); %put --> Note: Index created: &indxname.. ; quit; %end; %else %put --> Note: Index &indxname already exists! ; %finish: %mend crindex;